

#include "unity.h"
#include "unity_fixture.h"

#include "Log.h"
#include "BSP.h"
#include "BSP_Sleep.h"

#include "rfid_common.h"

void rfid_itf_clr_tag(uint8_t tag);
void rfid_itf_set_tag(uint8_t tag);

#define SIMPLE_BUF_SIZE		(4 * 1024)

int16_t simples[SIMPLE_BUF_SIZE];
uint16_t simple_len;

static void print_simples(const int16_t* buffer, uint32_t length){
	uint32_t j;
	for(j = 0; j < length; j++){
		if((j % 32) == 0){
			DBG_PRINT("\r\n");
		}
		DBG_PRINT("%d ", buffer[j]);
	}
	DBG_PRINT("\r\n");
}

void indala_data_decode(uint16_t *data, uint32_t len){
	print_simples((int16_t*)data, len);
#if 0
	const int central_value = compute_average_adc_value(data, len);//计算电压中心值
	uint32_t i;
	//滤波
//		for(i = 1; i < len; i++){
//			simples[i] = (data[i - 1] + data[i]) >> 1;
//		}
	
	for(i = 1;  i < len; i++){
		const int d = (data[i - 1] + data[i]) >> 1;
		simples[simple_len] = d - central_value;
		simple_len++;
		if(simple_len >= SIMPLE_BUF_SIZE){
			print_simples(simples, SIMPLE_BUF_SIZE);
			simple_len = 0;
		}
	}
#endif 
}


#include "IndalaTestData.c"


TEST_GROUP(Indala);


TEST_SETUP(Indala)
{
	BSP_RFID_Enable();
}

TEST_TEAR_DOWN(Indala)
{
	BSP_RFID_Disable();
}

/*
//峰峰值检测
1.当 数据变化方向变化的位置为峰值。
2. data[i] - data[i - 1] > 0时，波形上升，当出现 data[i] - data[i - 1] <= 0时，data[i - 1]为波峰。
3. data[i] - data[i - 1] < 0时，波形下降，当出现 data[i] - data[i - 1] >= 0时，data[i - 1]为波谷。
4. data[i] - data[i - 1] = 0时，波形未知，当出现 data[i] - data[i - 1] < 0时，data[i - 1]为波峰；
  当出现 data[i] - data[i - 1] > 0时，data[i - 1]为波谷。
5. 波峰 - 波谷 = 峰峰值。

//检测相位变化
1.抽取前200个采样点（50个采样点1个bit），获取前10个最大峰峰值。
2.去掉前最大值和最小值，取剩余8个值的平均，取得基准峰峰值。
3.大于基准1.5倍的峰峰值，为相位变化点。

//转换数据流

//每个数据为50个采样点
//相位变化的位为‘1’，否则为‘0’

1.从首个相位变化点开始，buffer写入1个bit‘1’。
2.计算两个相位变化点之间的采样点数量，采样数/50 = 数据bit数，bit0为‘1’，其余bit为‘0’.
3.将2的数据位左移到一个uint64_t 的buffer，初始值为0xFFFFFFFFFFFFFFFF。
4.缓存的数据大于等于64bit，判断低32bit是否为：0x00000000, 0xA0000000，0x80000001等SYNC。
*/

/*----------------------------------------------------*/


typedef struct {
	int16_t top;
	int16_t bottom;
}Peak_T;

static inline int16_t Peak_GetValue(const Peak_T* peak, const int16_t* data){
	return data[peak->top] - data[peak->bottom];
}

int Peak_Search(const int16_t* data, int length, int16_t* iterator, Peak_T* peak){
	int ret = -1;
	int i = *iterator;
	int8_t dir = 0;
	int8_t prevDir;
	uint8_t change = 0;
	
	if(data[i] < data[i + 1]){
		//上升
		dir = 1;
	}
	else
	if(data[i] > data[i + 1]){
		//下降
		dir = -1;
	}
	
	prevDir = dir;
	
	for(i = *iterator + 1; i < length; i++){
		if(data[i] < data[i + 1]){
			//上升
			dir = 1;
		}
		else
		if(data[i] > data[i + 1]){
			//下降
			dir = -1;
		}

		if(dir != prevDir){
			//趋势有变化
			if(dir > 0){
				//上升
				peak->bottom = i;
				change++;
			}
			else
			if(dir < 0){
				//下降
				peak->top = i;
				change++;
			}
			prevDir = dir;
			if(change > 1){
				//波峰波谷都获取到了
				ret = 0;
				break;
			}
		}
	}
	*iterator = i;
	return ret;
}


/*----------------------------------------------------*/

static void PrintPeak(const Peak_T* peak, const int16_t* data){
	DBG_PRINT("top=%d\t bot=%d\t val=%d\r\n", peak->top, peak->bottom, Peak_GetValue(peak, data));
}

Peak_T peaks[10];
Peak_T curPeak;

TEST(Indala, ReadBits)
{
	//BSP_RFID_Disable();
	int ret;
	int16_t iter = 0;
	rfid_itf_set_tag(0xFF);
	while(1){
		BSP_Sleep_Ms(100);
#if 0
		iter = 0;
		DBG_PRINT("\r\n Search Peak \r\n");
		while(1){
			ret = Peak_Search(simpleDatas, 200, &iter, &curPeak);
			if(ret == 0){
				PrintPeak(&curPeak, simpleDatas);
			}
			else{
				DBG_PRINT("\r\n End \r\n");
				break;
			}
		}
#endif 
	}
}



